package com.gqh.weather.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.gqh.weather.auth.UserContext;
import com.gqh.weather.auth.UserInfo;
import com.gqh.weather.domain.dto.MyPage;
import com.gqh.weather.domain.dto.StudentListData;
import com.gqh.weather.domain.dto.StudentListRequest;
import com.gqh.weather.domain.dto.StudentUpdateRequest;
import com.gqh.weather.exception.Result;
import com.gqh.weather.service.StudentService;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 学生管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/pingjia/zh/v1/task/student")
@Validated
public class StudentController {

    @Autowired
    private StudentService studentService;

    /**
     * 学生列表查询
     *
     * @param page      页数
     * @param count     每页数量，默认20
     * @param citycode  城市码
     * @param taskId    任务id
     * @param schoolId  学校id
     * @param isPic     照片0全部 1已上传 2未上传
     * @param state     状态0正常1待考
     * @param keyword   搜索关键字
     * @return 学生列表
     */
    @GetMapping("/list")
    public Result<MyPage<StudentListData>> getStudentList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "20") Integer count,
            @RequestParam(required = false) String citycode,
            @RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId,
            @RequestParam(name = "school_id", required = false) Integer schoolId,
            @RequestParam(name = "is_pic", required = false) Integer isPic,
            @RequestParam @NotNull(message = "状态参数不能为空") Integer state,
            @RequestParam(required = false) String keyword) {

        log.info("查询学生列表，任务ID: {}, 学校ID: {}, 状态: {}, 照片: {}, 关键字: {}", 
                taskId, schoolId, state, isPic, keyword);

        // 参数验证
        if (state != 0 && state != 1) {
            return Result.error("状态参数错误");
        }

        // 获取用户信息
        UserInfo userInfo = UserContext.getCurrentUser();
        if (citycode == null || citycode.isEmpty()) {
            citycode = userInfo.getCitycode();
        }

        // 构建查询请求
        StudentListRequest request = new StudentListRequest();
        request.setPage(page);
        request.setCount(count);
        request.setTaskId(taskId);
        request.setSchoolId(schoolId);
        request.setIsPic(isPic);
        request.setState(state);
        request.setCitycode(citycode);
        request.setKeyword(keyword);

        return studentService.getStudentList(request);
    }

    /**
     * 学生清空考生
     *
     * @param taskId 任务id
     * @return 清空结果
     */
    @PostMapping("/clear")
    public Result<Void> clearStudents(@RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId) {
        log.info("清空考生，任务ID: {}", taskId);

        if (taskId == 0) {
            return Result.error("任务id参数不正确");
        }

        return studentService.clearStudents(taskId);
    }

    /**
     * 学生锁定
     *
     * @param taskId 任务id
     * @return 锁定结果
     */
    @PostMapping("/lock")
    public Result<Void> lockStudents(@RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId) {
        log.info("学生锁定，任务ID: {}", taskId);

        if (taskId == 0) {
            return Result.error("任务id参数不正确");
        }

        return studentService.lockStudents(taskId);
    }

    /**
     * 学生删除
     *
     * @param id 学生id列表
     * @return 删除结果
     */
    @PostMapping("/delete")
    public Result<Void> deleteStudents(@RequestParam @NotNull(message = "学生ID不能为空") List<Integer> id) {
        log.info("删除学生，ID列表: {}", id);

        if (id.isEmpty()) {
            return Result.error("学生ID不能为空");
        }

        return studentService.deleteStudents(id);
    }

    /**
     * 学生修改
     *
     * @param id               学生id
     * @param name             姓名
     * @param sex              性别
     * @param studentNo        学籍号
     * @param grade            年级
     * @param schoolName       学校名
     * @return 修改结果
     */
    @PostMapping("/update")
    public Result<Void> updateStudent(
            @RequestParam @NotNull(message = "学生ID不能为空") Integer id,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) Integer sex,
            @RequestParam(name = "student_no", required = false) String studentNo,
            @RequestParam(required = false) Integer grade,
            @RequestParam(name = "school_name", required = false) String schoolName) {

        log.info("修改学生，ID: {}, 姓名: {}, 学籍号: {}", id, name, studentNo);

        // 获取用户信息
        UserInfo userInfo = UserContext.getCurrentUser();
        String citycode = userInfo.getCitycode();

        // 构建修改请求
        StudentUpdateRequest request = new StudentUpdateRequest();
        request.setId(id);
        request.setName(name);
        request.setSex(sex);
        request.setStudentNo(studentNo);
        request.setGrade(grade);
        request.setSchoolName(schoolName);

        return studentService.updateStudent(citycode, request);
    }

    /**
     * 学生导入
     *
     * @param taskId 任务id
     * @param file   导入文件
     * @return 导入结果
     */
    @PostMapping("/import")
    public Result<Void> importStudents(
            @RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId,
            @RequestParam @NotNull(message = "文件不能为空") MultipartFile file) {

        log.info("导入学生，任务ID: {}, 文件名: {}", taskId, file.getOriginalFilename());

        if (taskId == 0) {
            return Result.error("任务id参数不正确");
        }

        // 验证文件格式
        String filename = file.getOriginalFilename();
        if (filename == null || !filename.toLowerCase().endsWith(".xlsx")) {
            return Result.error("excel格式不支持,请上传xlsx格式");
        }

        // 获取用户信息
        UserInfo userInfo = UserContext.getCurrentUser();
        String citycode = userInfo.getCitycode();

        return studentService.importStudents(citycode, taskId, file);
    }

    /**
     * 学生导入模板下载
     */
    @GetMapping("/export")
    public Result<String> export() {
        return studentService.exportStudentTemplate();
    }

//    /**
//     * 学生人脸导入
//     *
//     * @param taskId    任务id
//     * @param studentId 学生id
//     * @param file      人脸图片文件
//     * @return 上传结果
//     */
//    @PostMapping("/upface")
//    public Result<Void> uploadStudentFace(
//            @RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId,
//            @RequestParam(name = "student_id", required = false) Integer studentId,
//            @RequestParam @NotNull(message = "文件不能为空") MultipartFile file) {
//
//        log.info("上传学生人脸，任务ID: {}, 学生ID: {}, 文件名: {}", taskId, studentId, file.getOriginalFilename());
//
//        if (taskId == 0) {
//            return Result.error("任务id参数不正确！");
//        }
//
//        return studentService.uploadStudentFace(taskId, studentId, file);
//    }
//
//    /**
//     * 学生人脸批量导入
//     *
//     * @param taskId 任务id
//     * @param files  人脸图片文件列表
//     * @return 上传结果
//     */
//    @PostMapping("/upfaces")
//    public Result<String> uploadStudentFaces(
//            @RequestParam(name = "task_id") @NotNull(message = "任务ID不能为空") Integer taskId,
//            @RequestParam("files[]") @NotNull(message = "文件不能为空") List<MultipartFile> files) {
//
//        log.info("批量上传学生人脸，任务ID: {}, 文件数量: {}", taskId, files.size());
//
//        if (taskId == 0) {
//            return Result.error("任务id参数不正确！");
//        }
//
//        if (files.isEmpty()) {
//            return Result.error("上传文件个数为0");
//        }
//
//        return studentService.uploadStudentFaces(taskId, files);
//    }
}
